package com.blacktech.dbu.meta.repository;

import com.blacktech.dbu.meta.entity.DbuTable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 数据表信息
 *
 * @author yanyunsong
 */
@Repository
public interface TableRepository extends JpaRepository<DbuTable, Long>, JpaSpecificationExecutor<DbuTable> {

    
    /**
     * 根据Schema ID查找所有表（按表名排序）
     * @param schemaId Schema ID
     * @return 表列表
     */
    List<DbuTable> findBySchemaIdOrderByTableName(Long schemaId);

    /**
     * 检查Schema下表名是否存在
     * @param schemaId Schema ID
     * @param tableName 表名
     * @return 是否存在
     */
    boolean existsBySchemaIdAndTableName(Long schemaId, String tableName);

    /**
     * 检查Schema下表名是否存在（排除指定ID）
     * @param schemaId Schema ID
     * @param tableName 表名
     * @param id 排除的表ID
     * @return 是否存在
     */
    @Query("SELECT COUNT(t) > 0 FROM DbuTable t WHERE t.schema.id = :schemaId AND t.tableName = :tableName AND t.id != :id")
    boolean existsBySchemaIdAndTableNameAndIdNot(@Param("schemaId") Long schemaId, @Param("tableName") String tableName, @Param("id") Long id);

    /**
     * 根据Schema ID和表名查找表
     * @param schemaId Schema ID
     * @param tableName 表名
     * @return 表
     */
    DbuTable findBySchemaIdAndTableName(Long schemaId, String tableName);

    /**
     * 根据Schema ID列表查找表（按Schema ID和表名排序）
     * @param schemaIds Schema ID列表
     * @return 表列表
     */
    @Query("SELECT t FROM DbuTable t WHERE t.schema.id IN :schemaIds ORDER BY t.schema.id ASC, t.tableName ASC")
    List<DbuTable> findBySchemaIdInOrderBySchemaIdAscTableNameAsc(@Param("schemaIds") List<Long> schemaIds);
}